﻿using System;
using System.Text.RegularExpressions;

namespace WirelessAccessPoint.DataAnnotations
{
    /// <summary>
    /// UIへの入力文字を正規表現によってフィルタする必要があることを表す属性です。
    /// InputXXXBehaviorによってこの属性が処理されます。
    /// </summary>
    [AttributeUsage(AttributeTargets.Property)]
    public class RegexInputTextFilterAttribute : InputTextFilterAttribute
    {
        private string pattern;
        private Regex regex;

        /// <summary>
        /// このクラスの新しいインスタンスを初期化します。
        /// </summary>
        public RegexInputTextFilterAttribute()
        {
        }

        /// <summary>
        /// このクラスの新しいインスタンスを初期化します。
        /// </summary>
        /// <param name="pattern">
        /// 正規表現のパターン。
        /// このパターンに一致する入力文字はフィルタを通過します。
        /// </param>
        public RegexInputTextFilterAttribute(string pattern)
        {
            this.pattern = pattern;
            this.regex = new Regex(pattern);
        }

        /// <summary>
        /// 正規表現のパターンを設定または取得します。
        /// このパターンに一致する入力文字はフィルタを通過します。
        /// </summary>
        public string Pattern
        {
            get { return pattern; }
            set
            {
                this.pattern = value;
                this.regex = new Regex(value);
            }
        }

        /// <summary>
        /// 入力文字がフィルタを通過できるかどうかを取得します。
        /// </summary>
        /// <param name="value">
        /// 入力文字。
        /// </param>
        /// <returns>
        /// 入力文字がフィルタを通過できる場合はTrue。
        /// それ以外の場合はFalse。
        /// </returns>
        public override bool IsValid(object value)
        {
            return this.regex.IsMatch(value.ToString());
        }
    }
}
